// #include <iostream>
// #include <vector>
// using namespace std;
// // zdl:: 读完题目这像是一道图论，现在我们先来看看！！！
// const int N = 25;
// int n;
// int m[N];
// vector<int> edges[N];
// int ret = 0;
// void dfs(int p, int &path)
// {
//     ret = max(ret, path);

//     for (auto &x : edges[p])
//     {
//         path += m[x];
//         dfs(x, path);
//         path -= m[x];
//     }
// }
// int main()
// {
//     cin >> n;
//     for (int i = 1; i <= n; i++)
//         cin >> m[i];
//     for (int i = 1; i <= n - 1; i++)
//     {
//         for (int j = i + 1; j <= n; j++)
//         {
//             int x;
//             cin >> x;
//             if (x)
//                 edges[i].emplace_back(j);
//         }
//     }

//     for (auto x : edges)
//     {
//         if (x.empty())
//             continue;
//         for (auto y : x)
//         {
//             cout << y << " ";
//         }
//         cout << endl;
//     }
//     int path = m[1];
//     dfs(1, path);
//     cout << ret << endl;
//     return 0;
// }


#include<iostream>

using namespace std;
// zdl:: 这大题目的特殊点就是需要求出具体的方案
// 使用递归就可以直接办到

const int N = 25;
int e[N][N];
int f[N], pre[N];
int m[N];

void dfs(int p)
{
    if (pre[p]) dfs(pre[p]);
    cout << p << " ";
}
int main()
{
    int n; cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> m[i];
    }
    for (int i = 1; i < n; i++)
    {
        for (int j = i + 1; j <= n; j++)
        {
            cin >> e[i][j];
        }
    }

    // zdl:: 现在就开始使用动态规划的方案
    for (int i = 1; i <= n; i++)
    {
        f[i] = m[i];
        for (int j = 1; j < i; j++)
        {
            if (e[j][i])
            {
                int pr = f[i];
                f[i] = max(f[i], f[j] + m[i]);
                if (pr != f[i])
                pre[i] = j;
            } 
            // zdl:: 维护pre数组 ， 记住在使前驱这个概念的时候不要直接使用ore应为在c++的概念中也会出现xinagprev的这样的名词横容易会重复
        }
    }
    int ret = 0, p = 0;
    for (int i = 1; i <= n; i++)
    {
        if (f[i] > ret)
        {
            ret = f[i];
            p = i;
        }
    }
    // zdl:: 接下来就是使用帝归来单输出具体的方案
    dfs(p);
    cout << endl << ret << endl;
    return 0;
}